/*Copyright (C) 2009 - 2011 Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdlib.h>
#include "files.h"
/*
** Permet d'ajouter un élément à la file.
**
** \parm file La file où ajouter l'élément.
** \parm data La valeur du nouvelle élément.
** \return 0 en cas de succès, une autre valeur en cas d'erreur.
*/
int File_Push(File *file, int data) {
	int retVal = 0;

	struct File *newData = malloc(sizeof(struct File));

	if(newData == NULL) {
		retVal = 1;
	}
	else {
		newData->data = data;
		newData->next = *file;
		*file = newData;
	}

	return retVal;
}

/*
** Permet d'enlever un élément à la file.
**
** \parm file La file où enlever l'élément.
** \return 0 en cas de succès, une autre valeur en cas d'erreur.
*/
int File_Pop(File *file) {
	int retVal = 0;

	if(*file == EMPTY_QUEUE) {
		retVal = 1;
	}
	else {
		File *tmp = file;
		/*on se déplace en début de file*/

		while((*tmp)->next != EMPTY_QUEUE) {
			tmp = & ((*tmp)->next);
		}

		/*on supprime le premier élément*/
		free(*tmp);

		*tmp = EMPTY_QUEUE;
	}

	return retVal;
}

/*
** Permet de savoir si la file est vide.
**
** \parm file La file à vérifier.
** \return 0 si la file contient des éléments, 0 si elle est vide.
*/
int File_Empty(const File file) {
	if(file == EMPTY_QUEUE)
		return 1;
	else
		return 0;
}

/*
** Permet de connaitre la valeur de l'élément en tête de file.
**
** \parm file La file à lire.
** \parm read Sera initialisé à valeur stockée en tête de pile.
** \return 0 en cas de succès, une autre valeur en cas d'erreur.
*/
int File_Front(File file, int *read) {
	int retVal = 0;

	if(file == EMPTY_QUEUE) {
		retVal = 1;
	}
	else {
		File tmp = file;
		/*on se déplace en début de file*/

		while(tmp->next != EMPTY_QUEUE) {
			tmp = tmp->next;
		}

		/*on lit la valeur du 1er élément.*/
		*read = tmp->data;
	}

	return retVal;
}

/*
** Permet de vider la file. Il est nécessaire d'appeler cette
** fonction à la fin du bloc d'instruction.
**
** \parm file La file à vider.
*/
void File_Clear(File *file) {
	while(*file != EMPTY_QUEUE && !File_Pop(file))
		;

	*file = EMPTY_QUEUE;
}

